# 语法错误、异常、异常捕获

# 语法问题
number = 100


def func():
    global number
    number += 1


# 异常:程序运行时爆出来的
def chu(a, b):
    return a / b


# x = chu(1, 0)  # ZeroDivisionError: division by zero
print("---------->")
# 异常处理：
"""
    try:
        可能出现异常的代码
    except:
        如果有异常的代码
    [finally:
        无论是否存在异常都会执行的代码]
        
异常捕获：
    情况一：可能出现多种异常
        try:
        可能出现异常的代码
        except 异常的类型1:
            如果有异常的代码         
        except 异常的类型2:
            如果有异常的代码  
    情况二：获取Exception报错的原因 
        try:
        可能出现异常的代码
        except 异常的类型1:
            如果有异常的代码         
        except 异常的类型2:
            如果有异常的代码  
        except Exception as err:
            print(err)---->err内容就是错误原因    
     情况三：else和return只能用一种
        try:
            可能出现异常的代码
        except 异常的类型1:
            如果有异常的代码         
        except 异常的类型2:
            如果有异常的代码  
        except Exception as err:
            print(err)---->err内容就是错误原因    
        else:
            print("没有异常时候执行")
        或者：
        try:
            可能出现异常的代码
        except 异常的类型1:
            如果有异常的代码         
        except 异常的类型2:
            如果有异常的代码  
        except Exception as err:
            print(err)---->err内容就是错误原因  
            return "异常中直接返回终止处理"   
     情况四：finally，不管报不报异常都会处理
        # 文件操作（释放资源） stream = open() stream.read() stream.close()
        # 数据库操作：close()
        try:
            可能出现异常的代码
        except:
            如果有异常的代码
        finally:
            无论是否存在异常都会执行的代码       
          
异常多种情况匹配顺序原则：
    是从上往下，因此exception需要放到最后执行
    else 和return 只能用一种
"""


def add():
    try:
        a = int(input("输入第一个数字："))  # ValueError: invalid literal for int() with base 10: 'a'
        b = int(input("输入第二个数字："))
        operator = input("输入运算符号：（+、—、*、/）:")
        result = 0
        if operator == "+":
            # + 加法
            result = a + b
            print("和：", result)
        elif operator == "-":
            result = a - b
            print("减：", result)
        elif operator == "*":
            result = a * b
            print("乘：", result)
        elif operator == "/":
            result = a / b
            print("除：", result)
        else:
            print("符号输出有误！")
        # 列表操作：模拟异常
        # lst = []
        # lst.pop()
        # 放到文档：模拟异常
        # with open("result-1.txt", 'r') as w_stream: # [Errno 2] No such file or directory: 'result-1.txt'
        #     print(w_stream.read())
        with open("result.txt", 'a', encoding="utf8") as w_stream:
            w_stream.write("本次运算的结果：{}".format(result))

    except ZeroDivisionError:
        print("除数不能为零！")
    except ValueError:
        print("参数必须是数字！")
    except Exception as err:
        print("出错了！", err)
        return "出错了！"
    else:
        print("没有异常才做执行的代码块！，如果异常中有return就不添加else")


# 求和
# add()


def fun():
    """
    释放资源
    :return:
    """
    stream = None
    try:
        stream = open("result.txt", 'r', encoding="utf8")
        content = stream.read()
        print(content)
        return 1
    except Exception as err:
        print(err)
        return 2
    finally:
        if stream:
            stream.close()
        return 3  # 会覆盖掉 上面的return值（1/2）------->覆盖内存的值


# 测试finally,及时try和except 中有return，还是执行finally
y = fun()
print(y)
